#include <stdio.h>
#include <pthread.h>

#define NUM_THREADS 1000

// 创建互斥锁
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int sum = 0;

void *thread_func(void *arg)
{
    // 同一时间只能有一个线程对sum进行操作
    pthread_mutex_lock(&mutex); // 加锁
    // 加锁和解锁时间越短越好
    sum++;
    pthread_mutex_unlock(&mutex); // 解锁
}

int main(int argc, char const *argv[])
{
    // 对一个公共变量进行多线程累加操作
    pthread_t threads[NUM_THREADS];
    for (int i = 0; i < NUM_THREADS; i++)
    {
        // 一千个线程执行的是一样的逻辑
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }

    // 等待所有线程结束,防止有的线程还没执行完就打印sum的值了
    for (int i = 0; i < NUM_THREADS; i++)
    {
        pthread_join(threads[i], NULL);
    }

    printf("sum = %d\n", sum);
    return 0;
}
